package io.github.gaisad.amweb2;

import day240904.MyDBUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

@WebServlet("/add-user")
public class AddUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/WEB-INF/add-user.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");

        // 接收用户输入的内容
        String name = req.getParameter("name");
        String email = req.getParameter("email");
        // 验证用户的输入

        // 保存到数据库
        Connection connection = MyDBUtil.getConnection();
        String sql = "INSERT INTO user (name, email) VALUES (?, ?)";
        PreparedStatement pstmt = null;
        try {
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setString(2, email);

            int affectedRows = pstmt.executeUpdate();

            if (affectedRows > 0) {
                // 跳转
                resp.sendRedirect(req.getContextPath() + "/users");
            } else {
                resp.getWriter().println("用户添加失败");
            }
        } catch (SQLException e) {
            resp.getWriter().println("添加用户时发生错误: " + e.getMessage());
        } finally {
            // 关闭资源
            //   - 参考之前完整的 JDBC 例子
            //   - 后打开的先关闭
            // 先关闭 ResultSet (由于当前例子没有用到它，无需关闭)
            // 再关闭 PreparedStatement
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            // Connection
            // 再关闭 Connection (当前例子不能直接关闭)
            // 原因：由于在当前项目中，我们通过 MyDBUtil 获取的 Connection 是单例的，不能在这里关闭，否则其他地方用不了
            // 思考：什么时候可以关闭它？
            // 后续可以引出以下一些知识点：
            //   - Listener
            //   - 之前已经学过，可以把数据存在几个作用域中：page、cookie、session；还可以存在 application 作用域
            //   - 数据库连接池
            /*if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }*/
        }
    }
}